package com.disease.api.service.service;

import com.disease.api.service.model.ResponseResult;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class CommonService {

    private  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    // 通过 -?[0-9]+(\\\\.[0-9]+)? 进行匹配是否为数字
    private static Pattern pattern = Pattern.compile("^[0-9a-zA-Z]+$");

    private static final Random random = new Random();
    private static final int MIN = 1000; // 四位数最小值
    private static final int MAX = 9999; // 四位数最大值
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");


    /**
     * 从身份证号解析出生年月日（返回 Date）
     * @param idCard 18位身份证号
     * @return 出生年月日（Date）
     * @throws IllegalArgumentException 身份证号不合法时抛出
     */
    public ResponseResult<String> parseBirthday(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            return ResponseResult.fail("身份证号必须为18位");
        }
        String birthdayStr = idCard.substring(6, 14); // 格式：YYYYMMDD
        try {
            sdf.setLenient(false); // 严格校验日期（避免 2月30日 等无效日期通过）
            return ResponseResult.success(sdf.format(sdf.parse(birthdayStr)));
        } catch (ParseException e) {
            return ResponseResult.fail("身份证号中的出生日期格式错误（" + birthdayStr + "）");
        }
    }

    /**
     * 通过正则表达式判断字符串是否为数字
     * @param str
     * @return
     */
    public  boolean isNumber(String str) {
        // 通过Matcher进行字符串匹配
        Matcher m = pattern.matcher(str);
        // 如果正则匹配通过 m.matches() 方法返回 true ，反之 false
        return m.matches();
    }


    /**
     * 生成唯一标识
     *
     * @return
     */
    public String generatorUniqueIdentifier(String orgCode) {
        // 获取当前时间戳（精确到秒）
        String timestamp = dateFormat.format(new Date());
        // 生成4位随机数
        int randomNum = random.nextInt(MAX - MIN + 1) + MIN;
        return orgCode + timestamp + randomNum;
    }


}
